package com.primaryedu.widget;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;

/**
 * ScrollView����Ч����ʵ��
 *
 * @author {jun.wang}
 * @description
 * @{date} 2015��11��27�� ����9:00:39
 */
public class BounceScrollView extends ScrollView {

    private View inner;// ����View
    private float y;// ���ʱy����

    private Rect normal = new Rect();// ����(����ֻ�Ǹ���ʽ��ֻ�������ж��Ƿ���Ҫ����.)

    private boolean isCount = false;// �Ƿ�ʼ����

    private boolean isScrollTop = true;

    public BounceScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /***
     * ���� XML ������ͼ�������.�ú�����������ͼ�������ã�����������ͼ�����֮��. ��ʹ���า���� onFinishInflate
     * ������ҲӦ�õ��ø���ķ�����ʹ�÷�������ִ��.
     */
    @Override
    protected void onFinishInflate() {
        if (getChildCount() > 0) {
            inner = getChildAt(0);
        }
    }

    /***
     * ����touch
     */
//	@Override
//	public boolean onTouchEvent(MotionEvent ev) {
//		if (inner != null) {
//			commOnTouchEvent(ev);
//		}
//		switch (ev.getAction()) {
//		case MotionEvent.ACTION_DOWN:
//			// if we can scroll pass the event to the superclass
//			if (mScrollable)
//				return super.onTouchEvent(ev);
//			// only continue to handle the touch event if scrolling enabled
//			return mScrollable; // mScrollable is always false at this point
//		default:
//			return super.onTouchEvent(ev);
//		}
//
//	}

    private boolean mScrollable = true;

    public void setScrollingEnabled(boolean enabled) {
        mScrollable = enabled;
    }

    public boolean isScrollable() {
        return mScrollable;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // Don't do anything with intercepted touch events if
        // we are not scrollable
        if (!mScrollable)
            return false;
        else
            return super.onInterceptTouchEvent(ev);
    }

    /***
     * �����¼�
     *
     * @param ev
     */
    public void commOnTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_UP:
                // ��ָ�ɿ�.
                if (isNeedAnimation()) {
                    animation();
                    isCount = false;
                }
                break;
            /***
             * �ų�����һ���ƶ����㣬��Ϊ��һ���޷���֪y���꣬ ��MotionEvent.ACTION_DOWN�л�ȡ������
             * ��Ϊ��ʱ��MyScrollView��touch�¼����ݵ�����LIstView�ĺ���item����.���Դӵڶ��μ��㿪ʼ.
             * Ȼ������ҲҪ���г�ʼ�������ǵ�һ���ƶ���ʱ���û��������0. ֮���¼׼ȷ�˾�����ִ��.
             */
            case MotionEvent.ACTION_MOVE:
                final float preY = y;// ����ʱ��y����
                float nowY = ev.getY();// ʱʱy����
                int deltaY = (int) (preY - nowY);// ��������
                if (!isCount) {
                    deltaY = 0; // ������Ҫ��0.
                }

                y = nowY;
                // �����������ϻ�������ʱ�Ͳ����ٹ�������ʱ�ƶ�����
                if (isNeedMove()) {
                    // ��ʼ��ͷ������
                    if (normal.isEmpty()) {
                        // ���������Ĳ���λ��
                        normal.set(inner.getLeft(), inner.getTop(),
                                inner.getRight(), inner.getBottom());
                    }
                    // �ƶ�����
                    inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,
                            inner.getRight(), inner.getBottom() - deltaY / 2);
                }
                isCount = true;
                break;

            default:
                break;
        }
    }

    /***
     * ��������
     */
    public void animation() {
        // �����ƶ�����
        TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),
                normal.top);
        ta.setDuration(200);
        inner.startAnimation(ta);
        // ���ûص������Ĳ���λ��
        inner.layout(normal.left, normal.top, normal.right, normal.bottom);
        normal.setEmpty();

    }

    // �Ƿ���Ҫ��������
    public boolean isNeedAnimation() {
        return !normal.isEmpty();
    }

    /***
     * �Ƿ���Ҫ�ƶ����� inner.getMeasuredHeight():��ȡ���ǿؼ����ܸ߶�
     *
     * getHeight()����ȡ������Ļ�ĸ߶�
     *
     * @return
     */
    public boolean isNeedMove() {
        int offset = inner.getMeasuredHeight() - getHeight();
        int scrollY = getScrollY();
        // 0�Ƕ����������Ǹ��ǵײ�
        if (scrollY == 0 || scrollY == offset) {
            return true;
        }
        return false;
    }

    public boolean isScrollT() {

        return isScrollTop;

    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        if (getScrollY() <= 0) {
            isScrollTop = true;
        } else {
            isScrollTop = false;
        }

    }

}
